package funcs

import (
	"fmt"
)

func DemoClosure() {
	var j int = 5

	/*支持闭包的多数语言都将函数作为第一级对象，
	就是说这些函数可以存储到变量中作为参数传递给其他函数，
	最重要的是能够被函数动态创建和返回*/

	a := func() func() { //返回一个匿名函数对象。多数语言都将函数作为第一级对象
		var i int = 10
		return func() {
			fmt.Printf("i, j: %d, %d\n", i, j)
		}
	}()

	a()

	j *= 2

	a()
}

func DemoAnonymousFunc() {
	/*Go的匿名函数是一个闭包*/
	f := func(x, y int) int {
		return x + y
	}(3, 4)

	fmt.Printf("f: %d\n", f)
}
